﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.IO;
using Estructuras.Comunes;

namespace Estructuras.Funciones.Analizar
{
    /// <summary>
    /// Clase que representa un dato no encontrado.
    /// </summary>
    public class DatosNoEncontrados
    {
        /// <summary>
        /// Registro original en el que se encuentra el dato.
        /// </summary>
        public string RegistroOriginal = string.Empty;

        /// <summary>
        /// Patrón del registro original.
        /// </summary>
        public string PatronRegistro = string.Empty;

        /// <summary>
        /// Campo en el que se encuentra el registro.
        /// </summary>
        public string Campo = string.Empty;

        /// <summary>
        /// Lista de datos no encontrados.
        /// </summary>
        private List<string> _listaDatos = null;

        /// <summary>
        /// Obtiene o establece la lista de datos no encontrados.
        /// </summary>
        public List<string> ListaDatos
        {
            get
            {
                if (_listaDatos == null)
                    _listaDatos = new List<string>();
                return _listaDatos;
            }
            set
            {
                _listaDatos = value;
            }
        }
    }

    /// <summary>
    /// Almacena las propiedades de un elemento específico.
    /// </summary>
    public class PDatosNoEncontrados : Propiedades
    {
        /// <summary>
        /// Lista Datos no encontrados.
        /// </summary>
        public List<DatosNoEncontrados> ListaDatos
        {
            get
            {
                if (!this.contienePropiedad(CDatosNoEncontrados.ListaDatos))
                    this.addPropiedad(CDatosNoEncontrados.ListaDatos, new List<DatosNoEncontrados>());
                return (List<DatosNoEncontrados>)this.getPropiedad(CDatosNoEncontrados.ListaDatos);
            }
            set
            {
                this.setOrAddPropiedad(CDatosNoEncontrados.ListaDatos, value);
            }
        }

        /// <summary>
        /// Constructor por defecto.
        /// </summary>
        public PDatosNoEncontrados()
            : base()
        {
        }

        /// <summary>
        /// Escribe los parámetros al fichero XML indicado.
        /// </summary>
        /// <param name="fichero">Stream de salida</param>
        public void escribir(TextWriter fichero)
        {
            try
            {
                XmlWriter xml = XmlWriter.Create(fichero);
                EscribirXml.InicioElemento(xml, CDatosNoEncontrados.NodoRaiz);
                foreach (DatosNoEncontrados registro in this.ListaDatos)
                {
                    if (registro.ListaDatos.Count != 0)
                    {
                        EscribirXml.InicioElemento(xml, CDatosNoEncontrados.NodoDato);
                        EscribirXml.EscribeNodo(xml, CDatosNoEncontrados.NodoDatoRegistroOriginal, registro.RegistroOriginal);
                        EscribirXml.EscribeNodo(xml, CDatosNoEncontrados.NodoDatoCampo, registro.Campo);
                        EscribirXml.EscribeNodo(xml, CDatosNoEncontrados.NodoDatoFormatoRegistro, registro.PatronRegistro);
                        EscribirXml.InicioElemento(xml, CDatosNoEncontrados.NodoDatoDatos);
                        foreach (string dato in registro.ListaDatos)
                            EscribirXml.EscribeNodo(xml, CDatosNoEncontrados.NodoDatoDatosPalabra, dato);
                        EscribirXml.FinElemento(xml);
                        EscribirXml.FinElemento(xml);
                    }
                }
                EscribirXml.FinElemento(xml);
                EscribirXml.Flush(xml);
                EscribirXml.Close(xml);
            }
            catch (Exception ex)
            {
                throw new Excepcion(Estructuras.Comunes.Constantes.ERROR_ESCRIBIR_FICHERO_DATOS_NO_ENCONTRADOS, ex, Estructuras.Comunes.Constantes.CODIGO_ERROR_ESCRIBIR_FICHERO_DATOS_NO_ENCONTRADOS);
            }
        }
    }
}
